陣列
陣列聽起來很專業,其實就是跟電腦要一個大箱子,裡面有n個相同大小的空間,讓我們來存放資料,說專業一點,陣列就是跟記憶起要一塊「連續」的空間供我們使用。
陣列的用途在於存放大筆資料,例如說50人的成績,如果沒有陣列就要宣告50個變數耶,那光是命名變數名稱就很耗費時間。
陣列大多都跟迴圈雙劍合璧一起使用。
陣列架構
宣告:DataType arrayName[size]
DataType:資料型態
arrayName:陣列名稱
size:陣列大小
Ex:int score[5]
※注意:宣告[5]是指5個位置,是從0到4並不是從1到5。
一維陣列
一維陣列就是有一個變數名稱後面接「一個」中括號的宣告,就是一維陣列。
例如:
int score[5]
同時也可以在宣告時給值,同時給值的時候可以不用寫陣列大小,編譯器會自行判定,沒給值初始則是,。
Ex:int score[5]={1,2,3,4,5} = int socre[]={1,2,3,4,5}
以下有幾個範例讓大家了解陣列的使用。
Source Code
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i,English[5],Math[]={10,50,80,100,20};
for(i=0;i<5;i++)
{
printf("Input English score:");
scanf("%d",&English[i]);
}
printf("English:");
for(i=0;i<5;i++)
printf("%d ,",English[i]);
printf("\nMath:");
for(i=0;i<5;i++)
printf("%d ,",Math[i]);
printf("\n");
system("PAUSE");
return 0;
}
執行結果
先宣告5個未使用的English陣列,跟5個已放值的Math陣列,配合for迴圈讀入並輸出值。
陣列只是放東西的盒子,用法跟前面的變數沒有太大的不同。
多維陣列
多維陣列就是一維以上的陣列就稱為多維陣列,其實通常我們都只用到二維陣列而已,再多也容易搞混,後面會用「結構體」代替多維陣列。
以二維陣列為例,宣告方法如下:
DataType arrayName[size1][ size2];
其中size1和size2為第一個維度和第二個維度,但這邊的2個維度不可以像前面1個維度一樣省略。
舉例:前面一個維度的陣列只能放一個人的成績,現在要放多人多個成績則使用2個維度的陣列,2個維度各放「人」與「成績」。
宣告:int score[2][3] = {{90,70,75},{100,40,20}};//表示有2個人, 3個成績。
下面放一個2維陣列應用
Source Code
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int card[52],count,player[4][13],i,j,tmp,rnd;
srand(time(NULL));
for(i=0;i<52;i++)
card[i]=i;//將牌放入盒子
for(i=0;i<52;i++)
{//洗牌
tmp = card[i];
rnd = rand()%52;
card[i] = card[rnd];
card[rnd] = tmp;
}
for(i=0;i<52;i++)
player[i%4][i/4]=card[i];//發牌
for(j=0;j<4;j++)
{
printf("player[%d]=",j);
for(i=0;i<13;i++)
{
if(player[j][i]<10)
printf("0");//排版
printf("%d",player[j][i]);
if(i<12)
printf(", ");//最後一個數字不用逗點
}
printf("\n");
}
printf("\n");
system("PAUSE");
return 0;
}
執行結果
為了讓程式碼容納在一頁中,有些for和if裡面程式碼只有一行的我就沒括號了,但是要記住沒括號只執行一行。
http://black31.wordpress.com/2008/05/22/c-%E9%9A%A8%E6%A9%9F%E4%BA%82%E6%95%B8-rand-srand/
rand()和srand()由於我不知道要放在哪個章節,它又很簡單所以這邊提供網址給大家參考。
洗牌的原理就是把第一張牌到最後一張牌依序用亂數和其他牌交換,陣列2數交換屬於三方傳球式
tmp = card[i];先保留
card[i] = card[rnd]將其中一方蓋掉;
card[rnd] = tmp;再將另一方蓋掉
如果不用3方傳球,就只能單方面蓋掉,不能達到互相交換。
player[i%4][i/4]=card[i]
接下來就是發牌了,這邊發牌是採1->2->3->4->1...的順序發牌,陣列第一個維度[] 是4個人物,順序是0->1->2->3->0...,第二個維度[] 則是13張牌,順序是0->0->0->0->1->1->1->1->2->2->2->2->...
所以結合起來就變成
0->1->2->3->0->1->2->3->0->1->2->3->;... 0->1->2->3
0->0->0->0->1->1->1->1->2->2->2->2->...12->2->12->12
接著就輸出了,輸出裡面有用一些判斷是來對輸出資料做個排版。